/**
 *
 * 针对不同的数据类型的过滤方式
 *
 * */


import moment from "moment";

/**
 * 字符串模糊匹配
 * @return 匹配上就返回true，否则返回false
 * */
export function stringLike(
	// 过滤器组件输入的值
	filterValue: string,
	// 被过滤的那条数据的某个属性的值
	dataValue: any
): boolean {
	// 没有输入过滤值
	if(filterValue === '') return true;

	if(typeof dataValue !== 'string' ) return false;
	return new RegExp(filterValue).test(dataValue);
}
export function stringEqual(filterValue: string, dataValue: string) {
	if(!filterValue) return true;
	return filterValue === dataValue;
}

/**
 * 数组类型的字符串匹配
 * */
export function stringArrayIncludes(filterValue: string[], dataValue: any): boolean {
	filterValue = filterValue.filter((item) => item !== '');
	if(filterValue.length === 0) return true;
	return filterValue.includes(dataValue);
}

/**
 * 数值等于
 * */
export function numberEqual(filterValue: number | string | null, dataValue: any): boolean {
	if(filterValue === null) {
		return true;
	} else if(filterValue === '') {
		return true;
	}
	return filterValue === dataValue;
}

/**
 * 日期匹配
 * filterValue 空字符串或则YYYY-MM-DD
 * */
export function dateStringEqual(filterValue: string, dataValue: any): boolean {
	if(!filterValue) return true;
	if(typeof dataValue !== "string") return false;
	try {
		return moment(filterValue).format('YYYY-MM-DD') === moment(dataValue).format('YYYY-MM-DD')
	} catch (e) {
		return false;
	}
}
/**
 * 时间段
 * filterValue 是 'YYYY-MM-DD'数组或者空字符串数组
 * */
export function dateRangeMatch(filterValue: string[], dataValue: any): boolean {
	if(filterValue.length === 0) return true;
	try {

		let startMoment = filterValue[0] ? moment(filterValue[0]) : null;
		let endMoment = filterValue[1] ? moment(filterValue[1]) : null;

		// 开始和结束都没有时间
		if((startMoment === null) && (endMoment === null)) return true;

		if(typeof dataValue !== 'string') return false;
		let dataValueMoment = moment(dataValue);

		let startMatch = (startMoment === null) || !startMoment.isAfter(dataValueMoment);
		let endMatch = (endMoment === null) || !endMoment.isBefore(dataValueMoment);

		return startMatch && endMatch;

	} catch(e) {
		return false;
	}
}
